היי,
אני מפתח אתר ובאתר יש סטטיסטיקות, הכוונה לכזה דבר:
http://i.imgur.com/zp6TJ3u.png .

ובקוד עצמו, לדוגמה החלק שמציג את מספר הרשומים נראה כך:
http://prntscr.com/4gd06n .

וזה עובד סבבה. השאלה היא האם כל פעם שארצה לעשות שאילתא אצטרך לעשות את הif הזה? אין דרך אחרת? כי הקוד סתם יצא ארוך, לדוגמה ככה: http://prntscr.com/4gd29f .

תודה מראש לעונים :)

8 תשובות

avatar ענה intval ב 25 לאוגוסט 2014 #

א. במקום לשלוף את כל השורות ואז להתעלם מהם ופשוט לקחת את num_rows אפשר לבקש מהמסד לא לקרוא את הנתונים, אלא רק לספור
ב. אפשר לחבר כמה שאילתות לאחת באמצעות הפקודה UNION

מה שיצא ייראה ככה:

select count(*) from users
UNION
select count(*) from users where blocked = 1
UNION
select count(*) from users where x = y

התוצאה של השליפה תהיה שלוש שורות כשבכל שורה שדה אחד שהוא מספר. תריץ אותה ותראה מה יוצא

avatar ענה undefined ב 25 לאוגוסט 2014 #

תודה על המענה, בנוגע לא' זה בהחלט נשמע יותר הגיוני ויעיל, חידשת לי, אך בכל זאת אם האופציה הזאת של count קיימת, למה יש פונקציית num_rows?
בנוגע ל2, הרצתי וקיבלתי 3 שורות, בכל שורה מספר אחר (בהתאם לטבלה עליה עשיתי count), איך עובדים עם המידע הזה בphp? הרי זו שאילתא אחת שנמצאת במשתנה אחד, יש דרך לגשת אליה ולקבל כל פעם נתון אחר? אולי כמו במערך (שכל שורה היא אינדקס אחר)? עשיתי את זה בינתיים:
http://prntscr.com/4gfosd .

אך מה לרשום בתוך המשתנה statics? הרי השליפה היא של מספר השורות בטבלה, לא של ערכים מעמודות מסוימות.

עריכה:
חיפשתי קצת בגוגל ומצאתי שצריך לאחר הcount לעשות alias, ואת מה שכתבתי בalias לכתוב בתוך statics. אך זה מציג מספר השורות של כל העמודות ביחד, לא רק של users, הינה השאילתא:

SELECT count(*) as users_total FROM users UNION SELECT count(*) as status_total FROM rstatus


עריכה שניה:
חיפשתי שוב בגוגל והגעתי כמו מקודם לstackoverflow, שם מצאתי את התשובה, והיא sub queires.
הקוד נראה עכשיו ככה:
http://prntscr.com/4ggcxd .

והוא עובד טוב, אך הוא יעיל? היית משנה בו משהו כדי לעשות אותו יותר טוב?
תודה מראש :)

avatar ענה intval ב 26 לאוגוסט 2014 #

אתה לא ממש צריך alias
אפשר לעבוד אם התוצאה בדיוק כפי שאתה עובד עם כל תוצאה אחרת בת כמה שורות שמוחזרת מהמסד
אפילו לא צריך לולאלות:

$query = "select count(*) from users
UNION
select count(*) from users where blocked = 1
UNION
select count(*) from users where x = y"
;

$result = $mysqli->query($query);
$stats = $result->fetchAll();

var_dump($stats);


אתה עשית אותו דבר, רק עם לולאה ומשהו מוזר בסגנון echo array. לא נראה לי שאפשר לעשות ככה echo לאלמנט במערך בלי אינדקס

avatar ענה undefined ב 26 לאוגוסט 2014 #

כדי להציג את הנתונים צריך בסופו של דבר לעשות לולאה (foreach) אם הולכים לפי הדרך שנתת, אך בכל זאת בהדפסה מה שמודפס הוא כל השורות ולא רק השורה שאני מעוניין בה (לדוגמה echo stats 0 כאשר 0 הוא האינדקס של השורה הראשונה מחזיר את כל השורות).

יש לך רעיון?

avatar ענה undefined ב 27 לאוגוסט 2014 #

הקפצה, מישהו פתח הרבה אשכולות.

avatar ענה intval ב 31 לאוגוסט 2014 #

לא הבנתי את השאלה.
התואצה של הפונקציה fetch_all היא מערך רב מימדי. אתה שואל איך לגשת אל נתונים בתוכו?

echo $stats[0][0] // count * from users
echo $stats[1][0] // select count(*) from users where blocked = 1
echo $stats[2][0] // select count(*) from users where x = y";

avatar ענה undefined ב 01 לספטמבר 2014 #

אוקיי הבנתי והצלחתי, ככה עכשיו זה נראה: http://prntscr.com/4imhz0 .
מה שהיה קודם נמצא בתוך ההערות.
אך מה יותר יעיל?

avatar ענה intval ב 01 לספטמבר 2014 #

אותו דבר